shell 中的 分发系统 expect脚本 (传递参数、自动同步文件、指定host和要传输的文件、(构建文件分发系统)(命令批量执行))
精选
原创
想剪个寸头
2022-07-31 19:13:11
©著作权
文章标签
vim
ip地址
绝对路径
linux
expect
文章分类
运维
©著作权归作者所有:来自51CTO博客作者想剪个寸头的原创作品,请联系作者获取转载授权,否则将追究法律责任
expect脚本编写示例
没有的话yum安装
yum -y install expect
需求1:执行脚本时自动远程登入
#!/usr/bin/expect 脚本格式注释
set host "192.168.44.128" 在expect里面要使用set指定 host 指定要连接的i地址
set passwd "123456" sed 指定密码
spawn ssh root@$host expect使用spawn后面跟shell的系统命令使用ssh远程指定登入
expect { expect的语句格式
"yes/no" { send "yes\r"; exp_continue } 初次登入一台新机器时会提示,表示上面的远程连接执行时匹配到到yes/no时 执行后面{}里的内容 出现则执行yes \r 表示回车 未匹配到则继续执行exp_continue 表示继续执行下面的内容
"password:" { send "$passwd\r" } 表示匹配到 password 时 执行{}里的内容 $passwd 表示上面的指定的变量 即密码 然后\r 回车执行
}
interact 结束
(interact这里表示远程登入之后停留在该机器上不退出
如果要退出的话 使用 expect eof 使用之后
登入之后会停留几秒钟退出来
如果interact 和 expect eof 都不加 登录之后马上就会退出来 )
chmod +x 脚本名称 然后增加权限
./脚本名称 执行
如图执行结果验证
![image.png](https://s2.51cto.com/images/20220731/1659265729803120.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
需求2:执行脚本时自动远程登入,并执行某个命令再退出来
#!/usr/bin/expect
set user "root"
set passwd "123456"
spawn ssh [email protected]
expect {
"yes/no" { send "yes\r" ; exp_continue }
"password:" { send "$passwd\r" }
} 上方内容于上面意思表达一致
expect "]*" 表示登入之后匹配 ]* 时
send "touch /root/123\r" 执行" " 里的命令 下方内容一致 依次执行
expect "]*"
send "echo 123456 > /root/123\r"
expect "]*"
send "exit\r" 直至这里执行exit退出
chmod +x 脚本名称 然后增加权限
./脚本名称 执行
如图执行结果验证
![image.png](https://s2.51cto.com/images/20220731/1659265746475533.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
登入被远程的机器验证
![image.png](https://s2.51cto.com/images/20220731/1659265764604065.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
expect 传递参数
#!/usr/bin/expect
set user [lindex $argv 0] 指定第一个参数 (参数信息参考根据下列执行脚本时的格式)
set host [lindex $argv 1] 指定第二个参数
set passwd "123456" 指定登入密码
set abc [lindex $argv 2] 指定abc 的参数 (第三个参数)
spawn ssh $user@$host 远程登入
expect {
"yes/no" {send "yes\r"}
"password:" { send "$passwd\r" }
}
expect "]*" 登入之后当达到匹配条件时
send "$abc\r" 执行输入的第三个参数
expect "]*" 达到条件时
send "exit\r" 退出
执行脚本格式
chmod +x 3.sh 加执行权限
3.sh root 192.168.44.128 "touch /usr/123;echo 123456 > /usr/123"
root 为第一个参数 ip为 第二个参数 后面的命令为第三个参数
可以使用单个命令 或 多个命令
使用多个命令时 用双引号且冒号分开
如图一执行结果验证 图二远程机器验证
![image.png](https://s2.51cto.com/images/20220731/1659265787736235.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
![image.png](https://s2.51cto.com/images/20220731/1659265797740680.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
expect 自动同步文件
#!/usr/bin/expect
set passwd "123456"
spawn rsync -av [email protected]:/usr/local/src /root/src //指定同步命令
expect {
"yes/no" { send "yes\r" }
"password:" { send "$passwd\r" }
}
expect eof
chmod +x 4.sh 加权限
./4.sh 执行
如图验证
![image.png](https://s2.51cto.com/images/20220731/1659265818226828.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
expect 指定host和要传输的文件
#!/usr/bin/expect
set passwd "123456"
set host [lindex $argv 0] 指定第一个参数
set file [lindex $argv 1] 指定第二个参数
spawn rsync -av $file root@$host:$file 指定本地传输到远程 如果要远程传输到本地 更换命令位置即可
expect {
"yes/no" { send "yes\r" }
"password:" { send "$passwd\r" }
}
expect eof
chmod +x 5.sh 加权限
./5.sh 执行
./5.sh 192.168.44.128 "/root/1.sh" 执行脚本命令 (路径最好写绝对路径)
格式理解 同上面介绍一样
如图一执行结果验证 图二远程机器验证
![image.png](https://s2.51cto.com/images/20220731/1659265833473942.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
![image.png](https://s2.51cto.com/images/20220731/1659265844381276.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
expect 构建文件分发系统
需求: 为多个ip地址同步目录文件(即a机器的目录文件同步到b、c、d......)
(此脚本需要知道每个被传机器的password 且一致 )
vim 6.sh
#!/usr/bin/expect
set passwd "123456" 指定密码
set host [lindex $argv 0] 指定参数
set file [lindex $argv 1] 指定参数
spawn rsync -avR--files-from=$file / root@$host:/ 核心命令 源目录是"/"(根) 目标目录也是根
expect {
"yes/no" { send "yes\r" }
"password:" { send "$passwd\r" }
}
expect eof
chmod +x 6.sh 增加执行权限
然后需要在a机器上创建一个文件 包含需要传输同步的目录文件路径
例如:
vim /usr/file.txt
/ust/123.txt (这里故意写错一个路径 方便后面验证)
/root/123/aaa.txt (一定写绝对路径 且前面的路径目标机器上要有,最后的文件路径没有没关系)
/etc/abc/bbb.txt (如果不确定目标机器路径是否存在 上方核心命令参数中 rsync -avR 加上R)
然后再在a机器上创建一个文件 包含被传机器的IP地址
例如:
vim /usr/ip.txt
192.168.44.128
192.128.44.131 (这里ip也写错一个)
然后创建一个shell脚本
vim 7.sh
#!/bin/bash
for i in `cat /usr/ip.txt` 首先循环遍历ip地址 (上面定义的被传机器的ip)
do
./6.sh $i /usr/file.txt 然后使用6.sh的expect脚本 进行传输file.txt里面的目录文件
done 结束
chmod +x 7.sh 增加执行权限
./7.sh 执行
如图一所示执行过程 图二远程机器验证同步结果
![image.png](https://s2.51cto.com/images/20220731/1659265861652982.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
![image.png](https://s2.51cto.com/images/20220731/1659265902298084.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
expect 命令批量执行
同上文件分发系统配置一样
首先编写expect 脚本
vim 8.sh
#!/usr/bin/expect
set host [lindex $argv 0]
set passwd "123456"
set abc [lindex $argv 1]
spawn ssh root@$host
expect {
"yes/no" { send "yes\r" }
"password:" { send "$passwd\r" }
}
expect "]*"
send "$abc\r"
expect "]*"
send "exit\r"
chmod +x 8.sh 增加执行权限
然后编写被控制机器的IP地址文档
vim vim /usr/ip.txt
192.168.44.128
192.168.44.131
最后编写 shell 脚本
vim 9.sh
#!/bin/bash
for i in `cat /usr/ip.txt` 循环遍历ip文档的内容
do
./8.sh $i "hostname" 使用8.sh的expect脚本执行 对每个IP地址的机器执行hostname 命令
done
chmod +x 9.sh 增加执行权限
./9.sh 执行
如图查看验证执行过程
![image.png](https://s2.51cto.com/images/20220731/1659265915559253.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
===============================================================
本文章参考《跟aming学linux书籍》
打赏
赞
收藏
评论
分享
举报
上一篇:linux 下vi/vim使用
下一篇:llinux 防火墙(selinux 防火墙、firewalld 、netfilter (iptables))及iptables 规则备份和恢复
|